package com.test.template.publish.invoke;


import com.test.template.tool.Tool;
import io.swagger.annotations.ApiModelProperty;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.*;

public class InvokeUtil {

    // 排除属性的名称
    static Set<String> ExcludeSet = new HashSet<String>(Collections.singletonList("serial"));
    static Class<ApiModelProperty> commentAnnotation = ApiModelProperty.class;


    /**
     * 检验是否是需要排除的属性名称
     *
     * @param name
     * @return
     */
    private static boolean inExcludeLikely(String name) {
        boolean flag = false;// 默认不在排除集合
        for (String s : ExcludeSet) {
            if (name.contains(s)) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    /**
     * 获取排除掉非法名称后的所有属性名称，
     * 属性名称包含私有属性
     *
     * @param clazz
     * @return
     */
    public static List<String> getPropNames(Class<?> clazz) {
        // ret-data
        List<String> list = new ArrayList<String>();

        // 获取所有字段，包括私有字段
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            String name = field.getName();
            if (!inExcludeLikely(name)) {
                list.add(field.getName());
            }
        }
        return list;
    }


    public static List<PropComment> getPropComments(Class<?> clazz) {
        // ret-data
        List<PropComment> list = new ArrayList<>();
        // 获取MyClass类中声明的所有字段
        Field[] fields = clazz.getDeclaredFields();

        // 遍历所有字段
        for (Field field : fields) {
            String name = field.getName();
            String typeName = field.getType().getTypeName();
            if (inExcludeLikely(name)) {
                continue;
            }

            PropComment propComment = new PropComment();
            // 加入属性名称
            propComment.setProp(name);
            // 加入属性的类型（不含包名）
            propComment.setPropType(Tool.subStringAfterLastPunctuation(typeName, "."));
            // 获取字段上的所有注解
            Annotation[] annotations = field.getAnnotations();
            // 打印每个字段及其注解
            if (field.isAnnotationPresent(ApiModelProperty.class)) {
                // 获取 ApiModelProperty 注解实例
                ApiModelProperty apiModelProperty = field.getAnnotation(ApiModelProperty.class);
                // 获取 value 属性值
                String comment = apiModelProperty.value();
                propComment.setComment(comment);
            }
            list.add(propComment);
        }
        return list;
    }


}
